/*
 * Copyright 2008 the Breachwalls OSS project and the Others.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package com.breachwalls.mogen.generator;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 自動生成設定を持つプロパティ.
 * @author todoken
 * @version $Revision: 31 $
 */
public final class ModelGenerationProperties {

    /**
     * デフォルトのプロパティファイル名.
     */
    public static final String PROPERTY_NAME = "mogen.properties";

    /**
     * ロガー.
     */
    private static Logger logger = LoggerFactory.getLogger(ModelGenerationProperties.class);

    /**
     * 自動生成定義読み込みベースディレクトリ.
     */
    private File baseDirectory;

    /**
     * 自動生成ファイル出力先ディレクトリ.
     */
    private File outputDirectory;

    /**
     * プロパティファイル.
     */
    private Properties properties;

    /**
     * コンストラクタ.
     */
    public ModelGenerationProperties() {
        this.properties = new Properties();
        InputStream is = null;
        ClassLoader loader = getClass().getClassLoader();
        try {
            is = loader.getResourceAsStream(PROPERTY_NAME);
            this.properties.load(is);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    logger.error("Failure closing " + PROPERTY_NAME , e);
                }
            }
        }

        URL url = loader.getResource(PROPERTY_NAME);
        File prop = new File(url.getFile());
        this.baseDirectory = prop.getParentFile();
        this.outputDirectory = new File(System.getProperty("user.home") + "/.mogen");
    }

    /**
     * 自動生成定義読み込みベースディレクトリを取得する.
     * @return 自動生成定義読み込みベースディレクトリ
     */
    public File getBaseDirectory() {
        return baseDirectory;
    }

    /**
     * 自動生成定義読み込みベースディレクトリを設定する.
     * @param newBaseDirectory 自動生成定義読み込みベースディレクトリ
     */
    public void setBaseDirectory(File newBaseDirectory) {
        this.baseDirectory = newBaseDirectory;
    }

    /**
     * 自動生成ファイル出力先ディレクトリを取得する.
     * @return 自動生成ファイル出力先ディレクトリ
     */
    public File getOutputDirectory() {
        return outputDirectory;
    }

    /**
     * 自動生成ファイル出力先ディレクトリを設定する.
     * @param newOutputDirectory 自動生成ファイル出力先ディレクトリ
     */
    public void setOutputDirectory(File newOutputDirectory) {
        this.outputDirectory = newOutputDirectory;
    }

    /**
     * 出力ファイルの文字コードを取得する.
     * @return 出力ファイルの文字コード
     */
    public String getOutputEncoding() {
        return properties.getProperty("mogen.output.encoding");
    }

    /**
     * テンプレートファイルのロケーションを取得する.
     * @return テンプレートファイルのロケーション
     */
    public String getTemplateLocation() {
        return properties.getProperty("mogen.template.location");
    }

}
